# -*- coding: utf-8 -*-
"""
@Time    : 2024/9/10 15:52 
@Author  : ZhangShenao 
@File    : 4.列表生成式.py 
@Desc    : 列表生成式

用列表的生成表达式语法创建列表容器
语法:
l = [for item in Iterable]
"""
import sys

# 使用列表生成式,创建列表
l1 = [i for i in range(0, 11)]
print(f"l1 = {l1}")  # l1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

l2 = [x + y for x in "ABCDE" for y in "1234567"]
# 全排列
print(f"l2 = {l2}")  # ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'B1', 'B2', 'B3',......]

# 通过生成式创建的列表,在列表创建后,所有元素就都已经就绪了
# 因此会占用大量的内存空间
square = [x ** 2 for x in range(1, 1001)]
# 使用sys.getsizeof函数,查看对象锁占用的内存大小(字节数)
print(f"square占用内存大小: {sys.getsizeof(square)}")  # square占用内存大小: 8856

# 通过生成器的方式,同样可以获取列表元素,但是并不会额外占用内存空间
# 而是每次调用生成器时,通过内部计算,获取下一个元素
generator = (x ** 2 for x in range(1, 1001))
print(f"generator占用内存大小: {sys.getsizeof(generator)}")  # generator占用内存大小: 200
for i in generator:
    print(i)
